/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Proveedores;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.sql.SQLException;
import java.text.ParseException;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;

/**
 *
 * @author alrojas
 */
public final class IPrincipal extends JFrame{

    private JLabel      buscarLab;
    private JTextField  buscarCam;
    private JTable      listaTab;
    private DefaultTableModel modelo;
    private TableRowSorter<TableModel> clasificador;
    private JButton     agregarBut;
    private JButton     editarBut;
    private JButton     eliminarBut;
    private JButton     cancelarBut;

    public IPrincipal(JFrame padre, boolean quePadre) throws HeadlessException {
        
        this.setLayout(new GridBagLayout());
        this.setTitle("Proveedores");
        
        inicializarComponentes();
        inicializarListeners(padre,quePadre);
        
        this.pack();
        this.setLocationRelativeTo(null);
        this.setVisible(true);
        
    }
    
    public void inicializarComponentes(){
        try {
            GridBagConstraints limites = new GridBagConstraints();
            limites.insets = new Insets(2, 2, 2, 2);
        
            buscarLab = new JLabel("Buscar Proveedor (Alt + B)"); buscarLab.setDisplayedMnemonic('B'); 
            limites.gridx = 0; limites.gridy = 0;
            add(buscarLab,limites);
            
            buscarCam = new JTextField(30); buscarLab.setLabelFor(buscarCam);
            limites.gridx = 1;
            add(buscarCam,limites);
            
            limites.fill = GridBagConstraints.BOTH;
            
            agregarBut = new JButton("Nuevo", new ImageIcon("figuras/add32.png"));
            agregarBut.setHorizontalTextPosition(SwingConstants.CENTER);
            agregarBut.setVerticalTextPosition(SwingConstants.BOTTOM) ;
            agregarBut.setVerticalAlignment(SwingConstants.CENTER);
            limites.gridx = 2; limites.gridy = 1; limites.gridwidth = 1; 
            add(agregarBut,limites);

            editarBut = new JButton("Editar", new ImageIcon("figuras/edit32.png"));
            editarBut.setHorizontalTextPosition(SwingConstants.CENTER);
            editarBut.setVerticalTextPosition(SwingConstants.BOTTOM) ;
            editarBut.setVerticalAlignment(SwingConstants.CENTER); 
            limites.gridx = 2; limites.gridy = 2;
            add(editarBut,limites);
            
            eliminarBut = new JButton("Eliminar", new ImageIcon("figuras/delete32.png"));
            eliminarBut.setHorizontalTextPosition(SwingConstants.CENTER);
            eliminarBut.setVerticalTextPosition(SwingConstants.BOTTOM) ;
            eliminarBut.setVerticalAlignment(SwingConstants.CENTER); 
            limites.gridx = 2; limites.gridy = 3;
            add(eliminarBut,limites);
            
            Vector<String> columnNames = new Vector<String>(); columnNames.add("ID"); columnNames.add("Razón Social"); columnNames.add("R.U.C."); columnNames.add("Dirección"); columnNames.add("Teléfono");
            
            Vector <Vector<String>> proveedores = CProveedor.dameTodo();
            DefaultTableModel modelo = new DefaultTableModel(proveedores,columnNames){
                
                @Override
                public boolean isCellEditable (int row, int column)
                {
                    return false;
                }
            };
            
            this.clasificador = new TableRowSorter<TableModel>(modelo);
            listaTab = new JTable(modelo); listaTab.setRowSorter(clasificador); listaTab.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
            limites.gridx = 0; limites.gridy = 1; limites.gridwidth = 2; limites.gridheight = 3;
            JScrollPane barras = new JScrollPane(listaTab); barras.setPreferredSize(new Dimension(490, 150));
            add(barras,limites);
        
        } catch (SQLException ex) {
            Logger.getLogger(IPrincipal.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(IPrincipal.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    public void inicializarListeners(final JFrame padre, final boolean quePadre){
        
        if (padre != null){
            
            listaTab.addMouseListener(new MouseAdapter(){
                public void mouseClicked(MouseEvent e){ 
                    if (e.getClickCount() == 2){
                        // La siguiente condicional es un asco!, iuuuu!
                        if (quePadre){ 
                            final Productos.IAgregar padreReal = (Productos.IAgregar) padre;
                            padreReal.actualizarProveedor(listaTab.getValueAt(listaTab.getSelectedRow(),2).toString());
                        }
                        else{
                            final Productos.IEditar padreReal = (Productos.IEditar) padre;
                            padreReal.actualizarProveedor(listaTab.getValueAt(listaTab.getSelectedRow(),2).toString());
                        }

                        setVisible(false);
                    }
                }
            });
        }
   
        buscarCam.getDocument().addDocumentListener(
            new DocumentListener() {
                @Override
                public void changedUpdate(DocumentEvent e) {
                    filtrar();
                }
                @Override
                public void insertUpdate(DocumentEvent e) {
                    filtrar();
                }
                @Override
                public void removeUpdate(DocumentEvent e) {
                    filtrar();
                }
        });
        
        agregarBut.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                IAgregar iAgregar = new IAgregar(Proveedores.IPrincipal.this);
            }
        } );
        
        editarBut.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                if(listaTab.getSelectedRowCount() > 0){
                    try {
                        new IEditar(IPrincipal.this,CProveedor.dameUno(Integer.parseInt(listaTab.getValueAt(listaTab.getSelectedRow(),0).toString())));
                    } catch (HeadlessException ex) {
                        Logger.getLogger(IPrincipal.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (ParseException ex) {
                        Logger.getLogger(IPrincipal.class.getName()).log(Level.SEVERE, null, ex);
                    }catch (SQLException ex) {
                        Logger.getLogger(IPrincipal.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (ClassNotFoundException ex) {
                        Logger.getLogger(IPrincipal.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
                else{
                    JOptionPane.showMessageDialog(null,"Seleccione al menos 1 proveedor!","Aviso",JOptionPane.WARNING_MESSAGE);    
                }
            }
        } );
        
        eliminarBut.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                if(listaTab.getSelectedRowCount() > 0){
                    try {
                        int confirmado = JOptionPane.showConfirmDialog(null,"Seguro que desea eliminar " + listaTab.getValueAt(listaTab.getSelectedRow(),1).toString());

                        if (JOptionPane.OK_OPTION == confirmado){
                            boolean resultado = CProveedor.eliminar(Integer.parseInt(listaTab.getValueAt(listaTab.getSelectedRow(),0).toString()));
                            if (resultado == false){
                                actualizar();
                                JOptionPane.showMessageDialog(null,"Producto eliminado correctamente!","Operación Exitosa!",JOptionPane.INFORMATION_MESSAGE);    
                            }
                        }
                    } catch (SQLException ex) {
                        Logger.getLogger(IPrincipal.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (ClassNotFoundException ex) {
                        Logger.getLogger(IPrincipal.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
                else{
                    JOptionPane.showMessageDialog(null,"Seleccione al menos 1 proveedor!","Aviso",JOptionPane.WARNING_MESSAGE);    
                }
                
            }
        });

    }
    
    private void filtrar() {
        RowFilter<TableModel, Object> rf = null;
        try {
            rf = RowFilter.regexFilter(buscarCam.getText());
        } catch (java.util.regex.PatternSyntaxException e) {
            return;
        }
        clasificador.setRowFilter(rf);
    }
    
    public void actualizar() throws SQLException, ClassNotFoundException{
            
        Vector <String> columnNames = new Vector<String>(); columnNames.add("ID"); columnNames.add("Razón Social"); columnNames.add("R.U.C."); columnNames.add("Dirección"); columnNames.add("Teléfono");
        Vector <Vector<String>> data = CProveedor.dameTodo();

        modelo = new DefaultTableModel(data,columnNames){

            @Override
            public boolean isCellEditable (int row, int column)
            {
                return false;
            }
        };
            
        clasificador = new TableRowSorter<TableModel>(modelo);
        listaTab.setModel(modelo); listaTab.setRowSorter(clasificador); listaTab.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
            
    }
}
